$include("js/mootools.js");

var _objectIndex=0;
var _ajaxState=
{
	obj:null,
	queue:0,
	init:function()
	{
		//如果能找到名为：ajaxState的DIV，就会初始化这个动作
		if(document.getElementById("ajaxState")!=null)
		{
			var obj=$("ajaxState");
			obj.style.position="absolute";
			obj.style.display='none';
			_ajaxState.obj=obj;
			_ajaxState.repos();
		}
	},
	repos:function()
	{
		if(_ajaxState.obj!=null && _ajaxState.obj.style.display!='none')
		{

			if($_.IE)
			{
				_ajaxState.obj.style.top=document.body.scrollTop+document.body.clientHeight-parseInt(_ajaxState.obj.style.height);
				_ajaxState.obj.style.left=document.body.scrollLeft+document.body.clientWidth-parseInt(_ajaxState.obj.style.width)-20;
			}
			else
			{
				_ajaxState.obj.style.top=self.pageYOffset+document.body.clientHeight-parseInt(_ajaxState.obj.style.height);
				_ajaxState.obj.style.left=self.pageXOffset+document.body.clientWidth-parseInt(_ajaxState.obj.style.width)-20;
			}
		}
	},
	add:function()
	{
		_ajaxState.queue++;
		if(_ajaxState.obj.style.display=='none')
		{
			_ajaxState.obj.style.display='';
			_ajaxState.repos();
		}
	},
	remove:function()
	{
		if(_ajaxState.queue<1)
			_ajaxState.queue=0;
		else
			_ajaxState.queue--;

		if(_ajaxState.queue==0)
		{
			_ajaxState.obj.style.display='none';
		}
	}
};

initEvents.push(_ajaxState.init);
scrollEvents.push(_ajaxState.repos);
resizeEvents.push(_ajaxState.repos);

function JavaClass(className)
{
	return {"class":className+"@"+(_objectIndex++)+"c"};  //生成的Class后加上一个类似于hashCode的ID，以c结尾表示在客户端生成
}

function OpeAjaxRequest(url,method,pTypes,pCount,forward)
{
	this.url=url;

	this.callback;  //回调方法
	this.forward=forward;  //是否是forward调用

	//这些是要发送过去的数据，统一放到config里
	this.config={};
	this.config["op"]=method;  //因为Method在Form中是关键字，传输的时候改成op
	this.config["pTypes"]=pTypes;
	this.config["pCount"]=pCount;

	var callback;
	var args;
	var self=this;

	this.result=function(data)
	{
		_ajaxState.remove();
		$debug("Async Data ("+data.length+") : "+data.replace(/\s/g,' '));

		//解析返回的数据并执行回调函数
		var parser=new OpeAjaxDataParser(data,self.forward);
		if(parser.isOK())
		{
			if(args==null)
				callback(parser.data);
			else
				callback(parser.data,args);
		}
	}

	this.execute=function(parameters)
	{
		var data={};
		for(var i=0;i<this.config.pCount;i++)
		{
			data['p'+i]=parameters[i];
		}

		this.config["data"]=Json.toString(data);

		if(parameters[this.config.pCount]==null)
		{//同步方式
			var myAjax=new Ajax(this.url, {method:'post',async:false});

			_ajaxState.add();
			myAjax.request(this.config);  //提交请求
			_ajaxState.remove();

			//取回数据
			var responseText=myAjax.transport.responseText;
			$debug("Data ("+responseText.length+") : "+responseText.replace(/\s/g,' '));

			//解析数据，返回
			var parser=new OpeAjaxDataParser(responseText,this.forward);
			
			if(parser.isOK())
				return parser.data;
			else
				return null;
		}
		else
		{//异步方式
			callback=parameters[this.config.pCount];
			args=parameters[this.config.pCount+1];

			var myAjax=new Ajax(this.url, {method:'post',onComplete:this.result});
			_ajaxState.add();
			myAjax.request(this.config);  //提交请求

			return myAjax;
		}
	}
}

//对Json的增强，用于处理递归对象等情况
function JsonBuilder(stack)
{
	this.stack=stack==null?{}:stack;
	this.index=0;

	this.i=0;
}

JsonBuilder.prototype.toString=function(obj)
{
	switch($type(obj))
	{
		case 'object':
			if(obj['class'])
			{
				var clazz=obj['class'];
				if(this.stack[clazz])
					return Json.toString({'class':clazz});
				else
				{
					this.stack[clazz]=obj;
					this.index++;
					var string=[];
					for (var property in obj) string.push(this.toString(property) + ':' + this.toString(obj[property]));
					return '{' + string.join(',') + '}';
				}
			}
	}

	return Json.toString(obj)
}

JsonBuilder.prototype.toObject=function(str)
{
	var obj=Json.evaluate(str)
	this._toObject(obj);
	return obj;
}

JsonBuilder.prototype._toObject=function(obj)
{
	if(obj!=null)// && $type(obj)=="object")
	{
		if(obj['class'] && this.stack[obj['class']]==null)
			this.stack[obj['class']]=obj;
		
		if($type(obj)=="object")
		{
			for(k in obj)
			{
				var clazz=obj[k]['class'];
				if(clazz!=null && this.stack[clazz]!=null)
						obj[k]=this.stack[clazz];
				else
						this._toObject(obj[k]);
			}
		}
		else if($type(obj)=="array")
		{
			for(var i=0;i<obj.length;i++)
			{
				var clazz=obj[i]['class'];
				if(clazz!=null && this.stack[clazz]!=null)
					obj[i]=this.stack[clazz];
				else
					this.toObject(obj[i]);
			}
		}
	}
}

/**
用于对返回的数据进行解析
data : 返回的数据
forward : 是否是Forward方式式返回的数据
*/
function OpeAjaxDataParser(text,forward)
{
	this.state=null;
	this.text=text;
	this.data=null;
	this.forward=forward;

	//状态是否正常
	this.isOK=function() { if(this.state=="OK") return true; return false; }

	//构造方法
	{
		if(this.text!=null && this.text.length>0)
		{
			//如果没有指定是否是Forward方式，根据数据的内容进行大致的判断
			if(this.forward==null)
			{
				if(this.text.substr(0,1)=="{" && this.text.substr(this.text.length-1,1)=="}")
					this.forward=false;
				else
					this.forward=true;
			}

			if(this.forward)
			{
				//处理异常(以"exception\n"开头)
				if(this.text.substr(0,10).toLocaleLowerCase()=="exception\n")
				{
					this.state="Exception";
					this.data=this.text.substr(10,this.text.length-10);
					$error(this.data);
				}
				else
				{
					this.data=text;
					this.state="OK";
				}
			}
			else
			{
				var obj=Json.evaluate(text);
				this.data=obj["data"];
				this.state=obj["state"];

				//出果状态不正常，显示出错信息
				if(!this.isOK())
					$error(this.data);
			}
		}
	}
}

/**
这部分程序的目的是让Form也能支持Ajax的方式进行发送
这样提交Form的处理方式就和标准Ajax保持一至了
*/
function OpeAjaxForm(form,callback,forward)
{
	this.form=$(form);
	this.callback=callback;
	this.forward=forward;

	var self=this;

	this.send=function(action,method,parameters)
	{
		if(action!=null)
			self.form.action=action;
		if(method!=null)
		{
			//如果没有method这个隐藏字段
			if(self.form.op==null)
			{
				$error(self.form.name+" must have a hidden feild : op !");
				return;
			}
			else
				self.form.op.value=method;
		}

		//处理参数，在里面加入回调方法
		if(parameters!=null)
			parameters["onComplete"]=self._result;
		else
			parameters={onComplete:self._result};

		parameters["method"]='post';

		if(this.callback==null)
		{
			parameters["async"]=false;

			_ajaxState.add();
			var myAjax=self.form.send(parameters);
			_ajaxState.remove();

			//取回数据
			var responseText=myAjax.transport.responseText;
			$debug("Form Data ("+responseText.length+") : "+responseText.replace(/\s/g,' '));

			//解析数据，返回
			var parser=new OpeAjaxDataParser(responseText,this.forward);
			
			if(parser.isOK())
				return parser.data;
			else
				return null;
		}
		else
		{
			_ajaxState.add();
			return self.form.send(parameters);  //异步方式发送表单
		}
	}

	this._result=function(data)
	{
		_ajaxState.remove();
		$debug("Async Form Data ("+data.length+") : "+data.replace(/\s/g,' '));

		//解析返回的数据并执行回调函数
		var parser=new OpeAjaxDataParser(data,self.forward);
		if(parser.isOK())
		{
			self.callback(parser.data);
		}
	}
}

